package java_thinking.unit_21._21_4;

import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

import java.util.HashSet;
import java.util.Set;

/**
 * @Desc:   4-2 通过封闭机制来确保线程安全 PersonSet 的状态完全由它的内置锁保护，所以它是一个线程安全的类
 * @author: cww
 * @DateTime: 2019-06-02 15:33
 */
@ThreadSafe
public class PersonSet {
    /**
     * PersonSet 的状态由HashSet来管理，而HashSet并非线程安全的，但是 mySet 是私有的，并且不会逸出，
     * 因此 HashSet被封闭在 PersonSet 中
     */
    @GuardedBy("this") private final Set<Person> mySet = new HashSet<>();

    /**
     * 唯一能访问mySet的两个路径，并且执行时需要获得PersonSet的锁
     * @param p
     */
    public synchronized void addPerson(Person p) {
        mySet.add(p);
    }
    public synchronized boolean containsPerson(Person p) {
        return mySet.contains(p);
    }

    /**
     * 如果 Person 是可变的，那么在访问从 PersonSet 中获得 Person 对象需要额外的同步
     * 最可靠的方法是使 Person 成为一个线程安全的类
     */
    interface Person {
    }
}
